/*
 * Copyright (C) 2019 Peng fei Pan <panpfpanpf@outlook.me>
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package me.panpf.sketch;


import me.panpf.sketch.request.*;
import me.panpf.sketch.uri.UriModel;
import me.panpf.sketch.zoom.PixmapBuild;
import ohos.agp.animation.Animator;
import ohos.agp.components.ComponentContainer;
import ohos.agp.components.Image;
import ohos.agp.components.element.Element;
import ohos.app.Context;
import ohos.global.resource.ResourceManager;
import ohos.media.image.ImageSource;

public interface SketchView {

    Context getContext();

    Element getDrawable();

    PixmapBuild getPixmapBuild();

    void setImageDrawable(Element drawable);

    Image.ScaleMode getScaleType();

    void clearAnimation();

    void startAnimation(Animator animation);

    ComponentContainer.LayoutConfig getLayoutParams();

    ResourceManager getResources();

    int getPaddingLeft();

    int getPaddingTop();

    int getPaddingRight();

    int getPaddingBottom();

    /**
     * 根据指定的 uri 显示图片
     * @param uri 图片 uri，支持全部的 uri 类型，请参考 <a href="https://github.com/panpf/sketch/blob/master/docs/wiki/uri.md">https://github.com/panpf/sketch/blob/master/docs/wiki/uri.md</a>
     * @return DisplayRequest
     */
    DisplayRequest displayImage(String uri);

    /**
     * 显示 drawable 资源图片
     * @param drawableResId drawable 资源 id
     * @return DisplayRequest
     */
    DisplayRequest displayResourceImage(int drawableResId);


    /**
     * 显示 assets 资源图片
     * @param assetFileName
     * @return DisplayRequest
     */
    DisplayRequest displayAssetImage(String assetFileName);

    //    /**
//     * 显示来自 {@link ContentProvider} 的图片
//     *
//     * @param uri 来自 {@link ContentProvider} 的图片 uri，例如：content://、file://，使用 {@link ContentResolver#openInputStream(Uri)} api 读取图片
//     */
    DisplayRequest displayContentImage(String uri);

    /**
     * 准备显示图片
     * @param uriModel
     */
    void onReadyDisplay(UriModel uriModel);


    /**
     * 获取显示参数
     * @return DisplayOptions
     */
    DisplayOptions getOptions();

    /**
     * 批量设置显示参数
     * @param newDisplayOptions
     */
    void setOptions(DisplayOptions newDisplayOptions);


    /**
     * 获取显示监听器
     * @return DisplayListener
     */
    DisplayListener getDisplayListener();

    /**
     * 设置显示监听器
     * @param displayListener
     */
    void setDisplayListener(DisplayListener displayListener);


    /**
     * 获取下载进度监听器
     * @return DownloadProgressListener
     */
    DownloadProgressListener getDownloadProgressListener();

    /**
     * 设置下载进度监听器
     * @param downloadProgressListener
     */
    void setDownloadProgressListener(DownloadProgressListener downloadProgressListener);


    /**
     * 获取显示缓存，此方法由 {@link Sketch} 调用，无需理会
     * @return DisplayCache
     */
    DisplayCache getDisplayCache();

    /**
     * 设置显示缓存，此方法由 {@link Sketch} 调用，无需理会
     * @param displayCache
     */
    void setDisplayCache(DisplayCache displayCache);


    /**
     * 是否开启了手势缩放功能
     * @return boolean
     */
    boolean isZoomEnabled();

    /**
     * 重新显示
     *
     * @param listener 在重新显示之前你可以通过这个 listener，修改缓存的 options
     * @return false：重新显示失败，之前没有显示过
     */
    boolean redisplay(RedisplayListener listener);


    /**
     * 是否使用更小的缩略图，此方法是为手势缩放里的分块显示超大图功能准备的
     * @return boolean
     */
    boolean isUseSmallerThumbnails();

    void setImageSource(ImageSource imageSource);

    void setImageUri(String uri);

    void setImageType(String type);
}
